27 跨国电商零售数据探索
27.1 引言RFM客户分层模型
RFM模型是客户价值分析的经典方法: - Recency(最近消费): 最近一次消费时间 - Frequency(消费频率): 消费次数 - Monetary(消费金额): 消费总金额
27.2 数据准备
# 注:skrfm.xlsx 数据文件本地没有,但平台已经内置
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
import pandas as pd # 导入Pandas数据分析库
import numpy as np # 导入NumPy数值计算库
import matplotlib.pyplot as plt # 导入Matplotlib绑图库
import warnings # 导入warnings模块用于控制警告输出
warnings.filterwarnings('ignore') # 忽略报错(警告)
#加载数据
rfm = pd.read_excel('skrfm.xlsx')
rfm['RFM'] = rfm['RFM'].str.strip() # 去除空格
def trans(x): # 定义函数trans
if x == '高高高': # 条件判断:x == '高高高'
return '重要客户' # 返回计算结果
elif x == '高低高': # 否则判断:x == '高低高'
return '低购买频率客户' # 返回计算结果
elif x == '低高高': # 否则判断:x == '低高高'
return '长期未消费客户' # 返回计算结果
elif x == '低低高': # 否则判断:x == '低低高'
return '长期未消费低购买频率客户' # 返回计算结果
elif x == '高高低': # 否则判断:x == '高高低'
return '低消费客户' # 返回计算结果
elif x == '高低低': # 否则判断:x == '高低低'
return '低购买频率低消费客户' # 返回计算结果
elif x == '低高低': # 否则判断:x == '低高低'
return '长期未消费低消费客户' # 返回计算结果
else: # 不满足以上条件时
return '其他待发展客户' # 返回计算结果
rfm['用户等级'] = rfm['RFM'].apply(trans) # 对数据应用自定义函数
print(rfm) # 输出变量rfm的值
rfm['用户等级'].value_counts() # 统计用户等级列各取值的频率分布
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体或其他支持中文的字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号'-'显示为方块的问题
# 创建柱状图
plt.figure(figsize=(12, 6))
# 绑制柱状图
bars = plt.bar(rfm['用户等级'].value_counts().index, rfm['用户等级'].value_counts().values, color='blue',alpha=0.4)
# 添加标题和标签
plt.title('各等级类型用户数', fontsize=16)
plt.xlabel('用户等级类型', fontsize=12) # 设置X轴标签
plt.ylabel('用户数', fontsize=12) # 设置Y轴标签
plt.xticks(rotation=45, ha='right') # 旋转x轴标签以便更好地显示
# 在柱子上方显示数值
for bar in bars:
height = bar.get_height() # 获取当前柱子的高度值(用于数据标注)
plt.text(bar.get_x() + bar.get_width() / 2., height, # 添加文本标注
f'{height:,}', # 格式化标注文本(千分位分隔)
ha='center', va='bottom', fontsize=9) # 设置标注文本的水平和垂直对齐方式
# 调整布局防止标签被截断
plt.tight_layout()
# 显示图形
plt.savefig("7.png")
#绘制饼图
user_levels = rfm['用户等级'].value_counts()
labels = user_levels.index # 用户等级的类别
values = user_levels.values # 每个类别的数量
# 创建饼图
plt.figure(figsize=(10, 6)) # 设置画布大小
# 绑制饼图
plt.pie(values, labels=labels, autopct='%1.1f%%', startangle=90, textprops={'fontsize': 12, 'color': 'white'})
# 添加标题和图例
plt.title('用户等级类型占比', fontsize=16)
plt.legend(labels, title="用户等级", loc="best",bbox_to_anchor=(1, 0.5)) # 图例位置自动调整为最佳位置
# 显示图表
plt.savefig("8.png")27.3 RFM分层映射
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行
# ==================== 定义客户分类函数 ====================
def classify_customer(rfm_value):
"""根据RFM值分类客户,返回客户等级"""
mapping = {
'高高高': '重要客户', # R、F、M三个维度都高,是最有价值的客户
'高低高': '低购买频率客户', # 最近消费、金额高,但频率低,有提升空间
'低高高': '长期未消费客户', # 频率高、金额高,但很久没消费,需要召回
'低低高': '长期未消费低购买频率客户', # 金额高但频率低且很久没消费
'高高低': '低消费客户', # 最近消费、频率高但金额低,适合培养
'高低低': '低购买频率低消费客户', # 最近消费但频率和金额都低
'低高低': '长期未消费低消费客户' # 很久没消费且金额低,需要激活或放弃
}
return mapping.get(rfm_value, '其他待发展客户') # 如果RFM值不在映射表中,归为"其他待发展客户"
# ==================== 应用分类函数 ====================
rfm['用户等级'] = rfm['RFM'].apply(classify_customer)
# 对每一行RFM值应用classify_customer函数,生成用户等级标签
# apply()是Pandas中高效处理行/列数据的方法
print('用户等级分布:') # 输出标题
print(rfm['用户等级'].value_counts()) # 统计每个等级的用户数量,了解客户结构27.4 可视化分析
27.4.1 柱状图
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行
# ==================== 设置中文字体支持 ====================
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# ==================== 统计各等级用户数量 ====================
user_counts = rfm['用户等级'].value_counts() # 统计每个用户等级的出现次数
# ==================== 创建柱状图 ====================
plt.figure(figsize=(12, 6)) # 创建12x6英寸的画布
bars = plt.bar(
user_counts.index, # x轴为用户等级
user_counts.values, # y轴为用户数量
color='steelblue', # 设置柱状图颜色为钢蓝色
alpha=0.6 # 设置透明度为0.6,使图表更加柔和
)
# ==================== 添加数值标签 ====================
for bar in bars: # 遍历每个柱子
height = bar.get_height() # 获取柱子的高度(即用户数量)
plt.text(
bar.get_x() + bar.get_width() / 2., # x坐标为柱子中心
height, # y坐标为柱子顶部
f'{int(height):,}', # 显示数值,使用千位分隔符
ha='center', # 水平居中对齐
va='bottom', # 垂直底部对齐
fontsize=10 # 字体大小为10
)
plt.title('各等级类型用户数', fontsize=16) # 设置图表标题
plt.xlabel('用户等级类型', fontsize=12) # 设置x轴标签
plt.ylabel('用户数', fontsize=12) # 设置y轴标签
plt.xticks(rotation=45, ha='right') # x轴标签旋转45度,右对齐,避免重叠
plt.grid(axis='y', alpha=0.3) # 显示y轴网格线,透明度0.3
plt.tight_layout() # 自动调整布局
plt.show() # 显示图表27.4.2 饼图
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行
# ==================== 准备饼图数据 ====================
user_levels = rfm['用户等级'].value_counts() # 统计各等级用户数
labels = user_levels.index # 饼图的标签(用户等级)
values = user_levels.values # 饼图的数值(用户数量)
# ==================== 创建饼图 ====================
plt.figure(figsize=(10, 6)) # 创建10x6英寸的画布
plt.pie(
values, # 饼图的数值
labels=labels, # 饼图的标签
autopct='%1.1f%%', # 显示百分比,保留1位小数
startangle=90, # 从90度(正上方)开始绘制
textprops={'fontsize': 11} # 设置文本字体大小为11
)
plt.title('用户等级类型占比', fontsize=16) # 设置图表标题
plt.legend(
labels, # 图例标签
title='用户等级', # 图例标题
loc='best', # 自动选择最佳位置
bbox_to_anchor=(1, 0.5) # 将图例放置在图表右侧
)
plt.tight_layout() # 自动调整布局
plt.show() # 显示图表27.5 分析结论
客户分层结果: 1. 重要客户: RFM都高,需重点维护 2. 低频客户: 频率低但金额高,可提升频率 3. 沉睡客户: 未消费需重新激活 4. 低价值客户: 需培育或放弃
营销策略: - 重要客户: VIP服务,专属优惠 - 低频客户: 促销活动,提高复购 - 沉睡客户: 召回活动,重新激活 - 低价值客户: 降低服务成本